你是否和我一样,有时候太忙或者刚好在国外旅行,就忘记检查自己的邮箱,导致没有看到信用卡账单,进而错过缴费?
通过自动化,你再也不用手动检查信用卡账单的 PDF 了,自动化可以帮你:
读取邮箱邮件
找出包含指定账单的邮件
下载该邮件附件
打开 PDF 并提取所需信息,例如缴款截止日期和金额
将缴款截止日期和金额转换为文本信息并整理到其他地方
后续应用:
I. 贴到你的 Excel 里,方便提醒自己何时缴费
II. 与你的银行余额进行比对,计算需要补多少钱进账户
III. 解析 PDF 内容并自动填入记账软件
接下来,我们来看如何实现这一功能!
あなたは私と同じように、忙しかったり旅行に行ったりすると、メールボックスの確認を忘れてクレジットカードの請求書に気づかず、支払いを逃してしまうことがあるでしょうか?
自動化の助けを借りれば、もう手動でクレジットカードの請求書PDFを確認する必要はありません。自動化は直接あなたを助けることができます。
1.メールを読み取る
2.指定された請求書を含むメールを見つける
3.そのメールの添付ファイルをダウンロードする
4.PDFを開き、必要な内容(例えば、支払期限日や金額)を見つける
5.支払期限日と金額をテキスト情報にコピーし、他の場所に整理する
6.後続の応用
Ⅰ. Excelに貼り付けて、いつ支払うべきかを思い出せるようにする
Ⅱ. 銀行残高と比較して、口座にいくら入金する必要があるかを計算する
Ⅲ. PDFの内容を解析して、会計ソフトに貼り付ける次に、どのように行うかを見ていきましょう!
安装 RPA 软件
首先,你需要一款强大的 RPA 自动化软件,这里我们使用台湾新创公司开发的 Emily.RPA 进行示范。
如何下载和安装,请参考
まず、強力なRPA自動化ソフトウェアが必要です。ここでは、台湾のスタートアップが開発したEmily.RPAを使って説明します。
ダウンロードとインストール方法については、こちらをご覧ください。
: 軟體下載 Download the software | EMILY.RPA
进入 RPA 后,先选择“训练模式”,然后清空工作文件夹。
RPA を起動したら、まず「訓練モード」を選択し、「作業フォルダをクリア」をクリックします。
由于稍后需要解析信用卡账单 PDF,我们需要准备一个存有自己身份证号的 TXT 文件,作为 PDF 密码,以防止身份证号直接存储在 Emily.RPA 中。准备好后,可以通过“导入文件”功能提前导入该文件,方便 Emily 读取密码。
後ほど請求書PDFを認識する必要があるので、EMILYに身分証明書が存在しないように、自分の身分証明書番号のtxtファイルを用意してPDFパスワードとして使用します。準備ができたら、「ファイルのインポート」からファイルをインポートしておくと、EMILYがパスワードを必要とするときにそのファイルを読み取ることができます。
選擇Email讀取模組
Email読み取りモジュールを選択します
选择“邮箱读取”模块。
邮箱模块的设置可参考以下两个视频:
設定方法については、以下の2つの動画をご参照くださいとのことですね。
- アプリケーションパスワードの設定:
- Emailの読み取り:
设置完成后(以 Gmail 为例),界面上方会显示如下内容:
設定が完了すると(Gmailの場合)、上部は以下の図のようになります。
接下来,我们添加代码来筛选包含信用卡账单的邮件:
再來我們加上程式碼去找指定的,包含我們信用卡帳單的資訊:
次に、クレジットカードの請求書情報を含む特定のメールを見つけるためのコードを追加します。
input.forEach((mail) => {
if (mail.subject.startsWith('國泰世華銀行信用卡') && mail.subject.endsWith('電子帳單'))
{
console.log(mail)
if (mail.attachments.length > 0) {
mail.attachments.forEach((att) =>
{
if (att.filename.endsWith('pdf')) {
api.write(att.filename, att.content)
api.write('unpaid.txt', att.filename)}
})
}
}
})
以上代码属于 JavaScript,相关函数和示例可以参考: Mail Reader - Online Document (emily.tips)
forEach,startsWith跟.endsWith都是 JavaScript 的内建函数,如果不清楚它们的用法,可以参考 MDN 文档 或直接询问 ChatGPT。
上記のコードはJavaScriptで書かれており、関連する関数と例については、[URL] を参照してください。
forEach、startsWith、および.endsWithはすべてJavaScriptの関数であり、不明な場合はMDNドキュメントを参照するか、ChatGPTに直接質問してください。
为什么要这样筛选?
因为邮箱中 “国泰世华银行” 开头的邮件可能不仅仅是 信用卡账单,也可能包含 营销邮件、对账单 等。因此,为了更精准地获取我们需要的信用卡账单邮件,我们 在结尾加上 '电子账单' 关键字 来过滤出真正的账单邮件。
如果要筛选其他银行的邮件
如果你想筛选 其他银行(例如 中国信托银行)的邮件,就需要 修改相应的关键字,例如:
国泰世华银行信用卡 ➝ 中国信托银行信用卡
电子账单 ➝ 对应银行的账单关键字
这样,就能精准获取所需的邮件数据。
このコードは、メールボックスから件名の先頭が「國泰世華銀行信用卡」で末尾が「電子帳單」であるメールを検索するものです。なぜなら、メールボックスには國泰世華銀行から始まるメールがクレジットカードの請求書メールだけでなく、マーケティングメールや取引明細などのメールも届く可能性があるからです。そのため、末尾に「電子帳單」という言葉を追加することで、必要なメールを正確に取得することができます。もし他の銀行のメールを取得する場合は、他の言葉に変更する必要があります。例えば、中國信託銀行のメールを取得する場合は、
程式碼中間可以改成:
コードの中間部分を以下のように変更できます。
if (mail.subject.startsWith('中國信託信用卡電子帳單'))
第二段代码的作用是 下载符合条件的 Email 附件。
操作步骤:
.修改代码 以符合自己的需求。
.点击右上角的 DEBUG 按钮。
.打开 Console(控制台)。
.点击 TEST,测试代码是否能正确找到目标邮件。
如果找到符合条件的邮件,Console(控制台)会显示相关信息,表示代码运行成功。
这样就能确认代码是否正确抓取到需要的邮件,并确保附件能够顺利下载!
如果抓不到邮件,可能的原因有:
2.SINCE DAYS AGO(查询邮件的时间范围)设置太短,导致邮件不在查询范围内。
解决方法:尝试增加天数,例如 SINCE 7 DAYS AGO 或更长的时间范围。
3.其他未知问题
解决方法:可以留言发问,或者调整 DEBUG 模式检查错误信息。
另外可以點選小視窗的工作資料夾看附件檔案有沒有正確被下載,有的話我們就可以儲存這個步驟了。
そして、2番目の部分では、条件に一致するメールの添付ファイルをダウンロードします。必要に応じてコードを変更した後、右上隅にあるデバッグをクリックし、次にコンソールをクリックして、テストをクリックします。メールが正しく取得できるかどうかを確認します。取得できる場合は、コンソールに「XXX.PNG」と表示されます。
取得できない場合は、
「.startsWith('中國信託信用卡電子帳單')」内のキーワード設定が誤っているため、取得できない可能性があります。
一番上のSINCE DAYS AGO(何日以内のメールを検索するか)の設定が短すぎるため、取得できない可能性があります。
いずれでもない場合は、コメントで質問してください
また、小さなウィンドウの作業フォルダをクリックして、添付ファイルが正しくダウンロードされているかどうかを確認できます。ダウンロードされていれば、このステップを保存できます。
接下來我們要使用另一個模組,點選"前往網址" > "pdf analyzer"
次に、別のモジュールを使用します。「URLへ移動」>「PDF Analyzer」をクリックします。
来解析刚刚的附件,先在密码的地方输入环境变量,填写刚刚导入的身份证字号,然后选择刚刚工作资料夹中的 PDF 文件。选择完成后,切换到视图模式,你会看到可以解析的文字区域都被标成红底
次に、先ほど添付したPDFファイルを解析します。まず、パスワードのところに環境変数を入力し、先ほどインポートした身分証明書番号を入力します。次に、pickで先ほどの作業フォルダにあるPDFファイルを選択します。選択後、viewに切り替えると、解析できるテキストブロックが赤くハイライト表示されます。
我们可以通过这些文字内容来定位。你可以将鼠标移动到某个文字对象上,按住 Shift 键并同时按下向下箭头键,这样就可以看到指向下方的文字对象了。
そして、私たちはこれらのテキスト内容を通じて位置を特定することができます。マウスを特定のテキストオブジェクトに移動させ、Shiftキーを押しながら下矢印キーを押すと、下に位置するテキストオブジェクトが表示されます。
然后,回到 Train 按下“贴上”,你可以看到刚刚想抓取的文字对象变成了代码。通过这种方式,我们就可以找到并定位到我们需要的文字对象了。
その後、Trainに戻って貼り付けボタンを押すと、先ほど取得しようとしたテキストオブジェクトがコードに変換されているのが確認できます。この方法を使えば、私たちが欲しいテキストオブジェクトを見つけることができます。
通常会找固定不变的文字,例如上方的“先生”,因为 PDF 模组可以根据关键字直接找到文字内容的位置。如果文字内容总是变动,下次会找不到。找到位置后,再根据相对位置去找我们要的文字内容,例如“本期应缴总额”总是会在“先生”的下方的下方的下方,我们可以打上以下程序代码:
通常は固定で変わらないテキストを探します。たとえば、上にある『先生』です。なぜなら、PDFモジュールはキーワードに基づいて直接テキスト内容の位置を見つけることができるからです。もしテキスト内容が常に変動している場合、次回は見つけられなくなります。位置を見つけた後、相対的な位置に基づいて欲しいテキスト内容を探します。たとえば、『本期應繳總額總』(今期支払い総額)は『先生』の下の下の下に位置しているので、以下のようなコードを入力できます:
api.closeDate = input.resolve( {"keyName":"先生","keyBounds":{"page":1}, "valPos":"DOWN"})//找"先生"的下面一個文字
api.dl = input.resolve( {"keyName":api.closeDate.text,"keyBounds":{"page":1}, "valPos":"DOWN"}) //繳款截止日
let deadline = api.dl.text.split('/')
let yyyy = parseInt(deadline[0]) + 1911 //將年份改成西元制
let wDate = deadline[1] + '/' + deadline[2] + '/' + yyyy.toString()
api.amount = input.resolve( {"keyName":api.dl.text,"keyBounds":{"page":1}, "valPos":"DOWN"}) //金額
console.log(api.amount.text)
console.log(api.dl.text)
api.write('amount.txt', api.amount.text)
api.write('dl.txt', api.dl.text)
相关程序以及文字定位的方法可以参考:
関連するプログラムやテキストの位置特定方法については、以下を参照してください。
PDF Analyzer - Online Document (emily.tips)
为何不用账单结账日,缴款截止日,或是直接抓金额呢?因为这三个资讯每个月总是会变动,无法预期也无法用固定关键字搜寻,所以才用先生(女生记得改成小姐)定位。程序中也可以看到缴款截止日已经用类似逻辑定位出来了。
程序最后我们要将抓出来的文字匯出方便后续使用,最后再加上 api.write 输出成文字档即可。
程序依照自己的需求改完后(如果你是其他银行的账单定位逻辑会不一样)可以按右上角的 DEBUG,再按 console,然后按下 TEST,看工作资料夹有没有多出两个 txt档以及能不能正确抓到金额跟日期。
なぜ帳單結帳日(請求締め切り日)、繳款截止日(支払い期限)、または金額を直接取得しないのかというと、これら3つの情報は毎月変動するため、予測できず、固定のキーワードで検索することができないからです。そのため、『先生』(女性の場合は『小姐』に変更してください)を使って位置を特定します。プログラムを見ると、繳款截止日(支払い期限)が同様のロジックで既に特定されていることも確認できます。
プログラムの最後では、取得したテキストをエクスポートして後で使いやすくします。最後にapi.writeを追加してテキストファイルとして出力するだけです。
プログラムを自分のニーズに合わせて修正した後(他の銀行の帳單の場合は位置特定ロジックが異なる可能性があります)、右上のDEBUGを押して、次にconsoleを押してからTESTを押します。すると、作業フォルダに2つのtxtファイルが追加されているか、また金額と日付が正しく取得できているかを確認できます。
抓得到的话会在 console 看到输出。如果抓不到,可能是定位问题,可以多使用 console.log 来检查是否抓到自己想要的文字,或者检查是否文字的位置或关键字设置不正确,确保定位准确。如果问题依然存在,可以尝试调整定位方式或参考之前的调试步骤来进行修正。"keyName":api.dl.text
的VALUE忘記加上.text
變成api.dl
取得できれば、コンソールで確認できます。取得できない場合は、位置特定に問題がある可能性があります。その場合、console.logを多用して、欲しいテキストが取得できているかを確認するか、"keyName":api.dl.text のVALUEに.textを付け忘れて、api.dlになってしまっている可能性があります。
当测试完 OK 后,可以将 pick 中的环境变量 %unpaid% 替换,这样就能够抓到原始 PDF 文件的文件名,而不受文件名和绝对路径的影响。完成这个步骤后,就可以保存这个流程,确保它在不同的环境中都能正确运行并提取信息。
TESTが問題なく終わったら、pickで環境変数 %unpaid% に切り替えます。これにより、元のPDFファイル名を取得できるようになり(こうすることでファイル名や絶対パスに影響されなくなります)、このステップを保存できます。
接下来,我们介绍如何设计“计算是否需要补余额”功能。为此,我们将使用另一个模块。首先,点击“前往网址” > “EXCEL Writer(Excel输出)”,然后在 PICK 中选择包含银行余额的数据。
通过该模块,我们可以将银行余额等数据导出到 Excel 中,并进行进一步的处理和计算,比如判断是否需要补余额。这种设计使得数据导出和后续计算更加直观和便捷。
次に、前の6-IIで紹介した『残高を補充する必要があるかどうかの計算機能』をどのように設計するか説明します。ここでは別のモジュールを使用します。『前往網址』(URLに移動)>『EXCEL Writer(エクセル出力)』を選択し、銀行残高のデータがあるものをPICKします。
假设你找到的自动扣缴银行那一行是 B2,并且需要获取该单元格的金额。可以参考以下的程序代码来实现:EXCEL Writer - Online Document (emily.tips)
先找到你平常自动扣缴银行的那一行看一下金额位置,假设在B2的话我们可以参考:
用api.getCell('Sheet1', 1, 1))抓出B2的金额,如果金额是在B3的话可以用api.getCell('Sheet1', 2, 1)),而如果金额是在A2的话可以用api.getCell('Sheet1', 1, 0)),依此类推, 第一个参数'Sheet1'则是分页名称的意思,如果分页名称是【余额】的话记得改成api.getCell('余额', 1, 1))。
接下来可以打上以下程式代码:
まず、普段自動引き落としに使用している銀行の行を見つけて、金額の位置を確認します。仮にB2にある場合、EXCEL Writer - Online Document (emily.tips)を参考にして、api.getCell('Sheet1', 1, 1)を使ってB2の金額を取得できます。もし金額がB3にある場合はapi.getCell('Sheet1', 2, 1)を、A2にある場合はapi.getCell('Sheet1', 1, 0)を使います。以此类推します。最初の引数'Sheet1'はシート名の意味で、もしシート名が【餘額】(残高)の場合は、api.getCell('餘額', 1, 1)に変更してください。
次に、以下のコードを入力できます:
// input{} represents excel workbook object
let balance = api.getCell('balance', 1, 1)
let amount = api.read('amount.txt').replace(/,/g, '')
if (parseInt(balance) < parseInt(amount)) {
let diff = parseInt(amount) - parseInt(balance)
api.setCell('balance', 1, 4, diff)
}
api.setCell('balance', 1, 2, api.read('amount.txt'))
api.setCell('balance', 1, 3, api.read('dl.txt'))
透過 Workspace Script - Online Document (emily.tips) 的api.read('price.txt')来读取我们刚刚存好的amount.txt,再通过api.setCell()写进我们要的栏位,剩下的程序则是计算是否需要补钱进去以及需要补多少钱还有写入刚刚缴款截止日。
都确定没问题后,按DEBUG跟TEST,开启工作资料夹检查一下,可以看到我们想填写的信息都填进去了。
Workspace Script - Online Document (emily.tips)のapi.read('price.txt')を通じて、先ほど保存したamount.txtを読み込みます。さらに、api.setCell()を使って必要な欄に書き込みます。残りのプログラムでは、資金を補充する必要があるかどうか、補充する場合いくら必要か、そして先ほどの支払い期限を書き込む計算を行います。
すべて問題がないことを確認したら、DEBUGとTESTを押して、作業フォルダを開いて確認します。すると、入力したい情報がすべて書き込まれているのが分かります。
就可以保存这个模块 停止整个技能(按左侧的结束) 并上传了。
これでこのモジュールを保存できます。
スキル全体を停止します(左側の『終了』を押してください)。
そしてアップロードします。
最后一步是设计一个机制,使我们在收到信用卡账单邮件时,能够自动触发这个技能(相关设置和功能可参考:https://docs.emily.tips/mailtrigger
)进入 EMILY 的设置 > 选择 邮件触发 > 点击 新增规则,在 from 栏填写发送邮件的邮箱地址,在 subject 栏填写邮件主题包含的关键字。只要收到的邮件主题包含该关键字,就会触发相应技能。例如,我们可以填写 "国泰世华银行信用卡"。最后,在最下方选择要触发的技能,选择刚刚设计的技能即可。这样一来,每次收到符合条件的邮件,就会自动触发该技能!
最後のステップとして、クレジットカードの請求書メールを受信した際にこのスキルを自動的に起動するよう設計します(設定と機能については、https://docs.emily.tips/mailtrigger を参照してください)。EMILYの設定に移動し、『郵件觸發』(メールトリガー)を選択して、『新增規則』(ルールを追加)をクリックします。『from』には誰から送られてきたときに起動するかを入力し、『subject』にはメールの件名に含まれるキーワードを入力します。受信メールにそのキーワードが含まれている場合に起動するので、ここでは『國泰世華銀行信用卡』(Cathay Pacific Bankクレジットカード)と入力できます。最下部では起動するスキルを選択し、先ほど設計したスキルを指定します。これで、メールを受信するたびにこのスキルが自動的に起動するようになります!
效果演示:
延伸应用:
公司若定期收到固定格式的对账单/报价单/采购单/出货单等邮件,可以利用此应用进行扩展和调整,实现自动化,提高效率。
设置新技能排程(Schedule Trigger - Online Document (emily.tips),定期检查是否接近缴款截止日,并在剩余天数小于设定值时,通过mail sender Mail Sender - Online Document (emily.tips)提醒自己
3. 透過Simple Web Automation - Online Document (emily.tips),将相关信息自动填入JIRA、Notion、记账软件或会计软件。
4. 邮件中的 Excel 文件若包含银行余额字段,也可通过与本示例相同的方法,从银行每月发送的对账单 PDF 中自动提取并生成相关数据!
「拡張応用:」
1.「会社が定期的に受け取る固定形式の対帳票(取引明細書)、見積書、発注書、出荷伝票などは、このアプリケーションを利用して拡張・修正することで、自動化による効率化を図るのに非常に適しています。」
2.「新しいスキルのスケジュールを設定し、Schedule Trigger - Online Document (emily.tips) を実行して、支払い期限が近づいているかどうかを確認します。期限まで数日以内になった場合、Mail Sender - Online Document (emily.tips) を通じて自分にリマインダーを送信します。」
3.「Simple Web Automation - Online Document (emily.tips) を利用して、これらの情報をNotion、会計ソフト、経理ソフトなどに自動入力します。」
4.「この記事で使用したExcelには銀行残高の欄がありますが、この欄の値は実は銀行から毎月送られてくる対帳票PDFを使って、この記事と全く同じ方法で自動生成することもできます!」